package cheat;

import helpers.InvalidArgumentException;
import helpers.enums.CoTrafiles;
import helpers.enums.CzyStosujeContinuation;
import helpers.enums.IleRakRozgrywa;
import helpers.enums.RuchPrzeciwnika;
import helpers.enums.Suggestion;
import helpers.enums.UkladNaFlopie;
import helpers.enums.ZachowaniePrzedFlopem;
import smile.Network;

public class BayesNetworkHelper {

	private Network net = new Network();

	public BayesNetworkHelper() {
		net.readFile("resource/poker.xdsl");
	}

	public void setIleKolorowNaStole(int number) {
		if (number < 1 || number > 3) {
			throw new InvalidArgumentException();
		}
		net.setEvidence("IleKolorowNaStole", number - 1);
	}

	public void setNaIleSposobowStreet(int number) {
		if (number < 0 || number > 3) {
			throw new InvalidArgumentException();
		}
		net.setEvidence("NaIleSposobowStreet", number);
	}

	/**
	 * 
	 * @param number
	 *            - 0 if small, 1 if normal
	 */
	public void setGlebokoscTwojegoStosu(int number) {
		if (number < 0 || number > 1) {
			throw new InvalidArgumentException();
		}
		net.setEvidence("GlebokoscTwojegoStosu", number);
	}

	public void setUkladNaFlopie(UkladNaFlopie ukladNaFlopie) {
		net.setEvidence("UkladNaFlopie", ukladNaFlopie.ordinal());
	}

	public void setIleRakRozgrywa(IleRakRozgrywa ileRakRozgrywa) {
		net.setEvidence("IleRakRozgrywa", ileRakRozgrywa.ordinal());
	}

	public void setCzyStosujeContinuation(
			CzyStosujeContinuation czyStosujeContinuation) {
		net.setEvidence("CzyStosujeContinuation", czyStosujeContinuation
				.ordinal());
	}

	public void setCzyPrzeciwnikJestDobry(boolean czyPrzeciwnikJestDobry) {
		net.setEvidence("CzyPrzeciwnikJestDobry", czyPrzeciwnikJestDobry ? 0
				: 1);
	}

	public void setCoTrafiles(CoTrafiles coTrafiles) {
		net.setEvidence("CoTrafiles", coTrafiles.ordinal());
	}

	public void setRuchPrzeciwnika(RuchPrzeciwnika ruchPrzeciwnika) {
		net.setEvidence("RuchPrzeciwnika", ruchPrzeciwnika.ordinal());
	}

	public void setZachowaniePrzedFlopem(
			ZachowaniePrzedFlopem zachowaniePrzedFlopem) {
		net.setEvidence("ZachowaniePrzedFlopem", zachowaniePrzedFlopem
				.ordinal());
	}

	public void setIleWysokichKartNaFlopie(int number) {
		if (number < 0 || number > 3) {
			throw new InvalidArgumentException();
		}
		net.setEvidence("IleWysokichKartNaFlopie", number);
	}

	public Suggestion getSuggestion() {
		net.updateBeliefs();
		double[] values = net.getNodeValue("Rada");
		return new Suggestion(values);
	}
}
